iT邦幫忙

2023 iThome 鐵人賽

DAY 17
0
自我挑戰組

C# 和 SQL 探索之路 - 2系列 第 17

Day 17: SQL 用 PIVOT 語法旋轉資料

  • 分享至 

  • xImage
  •  

嗨嗨~ 邁入第十七天囉,接下來應該都以 SQL 語法為主。
而今天要介紹的是 SQL 中好用的 PIVOT 語法,可以用來旋轉表格,進行彙總作業。

PIVOT 語法說明

SELECT 非 PIVOT 欄位 ... 
	, 第一個 PIVOT 欄位
	, 第二個 PIVOT 欄位
	...  
	, 最後的 PIVOT 欄位  
FROM  
	資料來源
PIVOT  
(  
	要使用的彙總函數(被彙總欄位)  
FOR   
	包含 PIVOT 類別的欄位
	IN (第一個 PIVOT 欄位, 第二個 PIVOT 欄位, ... , 最後的 PIVOT 欄位)  
) AS PIVOT 表格別名
選擇性的 ORDER BY 子句;  

參考資料: 使用 PIVOT 和 UNPIVOT - SQL Server - Microsoft Learn

範例

CREATE TABLE Customer(
	[Name] VARCHAR(20),
	ItemClass VARCHAR(20),
	ItemPrice MONEY
)

INSERT INTO Customer ([Name], ItemClass, ItemPrice)
VALUES ('小明' , '玩具', '100'), ('小華', '書籍', '200')
	, ('小美', '書籍', '150'), ('小華', '書籍', '200')
	, ('小明', '零食', '75'), ('小華', '零食', '120');

SELECT [Name], ItemClass, ItemPrice FROM Customer

SELECT PVT.Name
	, ISNULL(PVT.玩具, 0) AS 玩具
	, ISNULL(PVT.書籍, 0) AS 書籍
	, ISNULL(PVT.零食, 0) AS 零食
FROM Customer
PIVOT(
	SUM (ItemPrice)
	FOR ItemClass IN ([玩具], [書籍], [零食])
) AS PVT

DROP TABLE Customer

原本的資料表為:

Name ItemClass ItemPrice
小明 玩具 100.00
小華 書籍 200.00
小美 書籍 150.00
小華 書籍 200.00
小明 零食 75.00
小華 零食 120.00

用 PIVOT 旋轉後會變成:

Name 玩具 書籍 零食
小明 100.00 0.00 75.00
小美 0.00 150.00 0.00
小華 0.00 400.00 120.00

注意

如果在 SQL 中以 PIVOT 旋轉並彙總部分相同的資料,有可能會造成「原始相同的資料」計算結果錯誤。例如以下的範例:SQL Server PIVOT returns only one row - Database Administrators Stack Exchange

這時可以為資料用 Row_Number() 建立編號,使其被視為不同的資料,再呼叫 PIVOT 旋轉。


上一篇
Day 16: SQL 索引簡介 2
下一篇
Day 18: SQL 的 UNPIVOT 語法
系列文
C# 和 SQL 探索之路 - 230
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言